
import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil 
{
    private static final SessionFactory sessionFactory;
    static 
    {
      try 
      {
        //sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        sessionFactory = new Configuration().configure().buildSessionFactory();
      } 
      catch (HibernateException ex) 
      {
            throw new RuntimeException("Configuration problem: " + ex.getMessage(), ex);
      }
}
    public static final ThreadLocal session = new ThreadLocal();
    /*Использование класса ThreadLocal позволяет ассоциировать с каждым потоком собственную копию какого-либо ресурса. 
     В частности, ThreadLocal удобно использовать при работе с JDBC: поскольку классы, реализующие интерфейс Connection,
     не являются потокобезопасными (по крайней мере, спецификация этого интерфейса не содержит такого требования), 
     то каждому потоку, осуществляющему доступ к базе данных, необходимо предоставить отдельный экземпляр Connection. */
    public static Session currentSession() throws HibernateException 
    {
        Session s = (Session)session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

    public static void closeSession() throws HibernateException 
    {
        Session s = (Session) session.get();
        session.set(null);
        if (s != null)
            s.close();
    }

}
